from flask import current_app
from flask import g, jsonify
from flask import redirect
from flask import render_template
from flask import request

from info import constants, db
from info.models import Category, News
from info.modules.profile import profile_blu
from info.utils.captcha.image_storage import storage
from info.utils.common import user_login_data
from info.utils.response_code import RET


"""待审列表逻辑"""
@profile_blu.route("/news_list")
@user_login_data
def user_news_list():

    page=request.args.get("p",1)

    user=g.user

    # 默认新闻列表对象列表为空
    news_list=[]
    current_page=1
    total_page=1

    # 查询要审核的新闻
    try:
        paginates=News.query.filter(News.user_id==user.id).paginate(page,constants.USER_COLLECTION_MAX_NEWS,False)
        news_list=paginates.items
        current_page=paginates.page
        total_page=paginates.pages
    except Exception as e:
        current_app.logger.error(e)

    #定义一个空的新闻字典列表
    news_list_li=[]

    for news in news_list:
        news_list_li.append(news.to_review_dict())

    data={
        "news_list_li":news_list_li,
        "current_page":current_page,
        "total_page":total_page

    }

    return render_template("news/user_news_list.html",data=data)






"""新闻发布逻辑"""
@profile_blu.route("/news_release",methods=["GET","POST"])
@user_login_data
def nwes_release():
    if request.method == "GET":
        # 获取所有新闻的分类数据
        categories=[]
        try:
            # 获取所有的分类数据
            categories=Category.query.all()
        except Exception as e:
            current_app.logger.error(e)


        # 定义一个保存数据的列表
        categories_list=[]
        for category in categories:

            # 获取一个字典列表
            categories_list.append(category.to_dict())

        # 删除 最新 分类
        categories_list.pop(0)
        data={
            "categories":categories_list
        }
        return render_template("news/user_news_release.html",data=data)

    # POST 提交,执行发布新闻操作

    # 1 获取要提交的数据
    # 标题
    title = request.form.get("title")
    # 新闻来源
    source = "个人发布"
    # 摘要
    digest = request.form.get("digest")
    # 新闻内容
    content = request.form.get("content")
    # 索引图片
    index_image = request.files.get("index_image")
    # 分内的id
    category_id = request.form.get("category_id")

    # 1.1 校验参数
    if not all([title, source, digest, content, index_image, category_id]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数有误")

    # 1.2 尝试读取图片
    try:
        index_image = index_image.read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="读取图片失败")

    # 2 将图片保存到七牛云
    try:
        # 自己封装的方法,存图片
        key = storage(index_image)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="保存图片失败")

    # 3 初始化新闻模型,并且设置相关数据
    news = News()
    news.title = title
    news.digest = digest
    news.source = source
    news.content = content
    news.index_image_url = constants.QINIU_DOMIN_PREFIX + key
    news.category_id = category_id
    news.user_id = g.user.id


    # 4 代表待审状态
    news.status=1

    try:
        db.session.add(news)
        db.session.commit()
    except Exception as e:
        current_app.logger.error(e)
        db.session.rollback()
        return jsonify(errno=RET.DBERR, errmsg="数据保存失败")

    # 5 返回结果
    return jsonify(errno=RET.OK, errmsg="发布成功,等待审核")







"""用户新闻收藏逻辑"""
@profile_blu.route("/news_collection",methods=["GET","POST"])
@user_login_data
def news_collection():
    # 获取参数
    page=request.args.get("p",1)

    # 判断参数
    try:
        page=int(page)
    except Exception as e:
        current_app.logger.error(e)
        page=1


    #查询用户指定页面的收藏的新闻
    user=g.user
    news_list = []
    current_page = 1
    total_page = 1
    try:

        paginate = user.collection_news.paginate(page, constants.USER_COLLECTION_MAX_NEWS, False)

        # 当前页
        current_page = paginate.page
        # 总页数
        total_page = paginate.pages
        # 新闻总数
        news_list = paginate.items
    except Exception as e:
        current_app.logger.error(e)


    #将新闻列表对象遍历成新闻字典对象
    news_list_li=[]
    for news in news_list:
        news_list_li.append(news.to_basic_dict())

    data={
        "total_page":total_page,
        "current_page":current_page,
        "collections":news_list_li
    }

    return render_template("news/user_collection.html",data=data)









"""用户修改密码"""

@profile_blu.route("/pass_info",methods=["GET","POST"])
@user_login_data
def pass_info():
    # 如果不带参数就是访问该网页
    if request.method=="GET":
        return render_template("news/user_pass_info.html")

    # 1 获取参数
    old_password=request.json.get("old_password")
    news_password=request.json.get("new_password")

    # 2 校验参数
    if not all([old_password,news_password]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    # 3 判断就密码是否正确
    user=g.user
    if not user.check_passowrd(old_password):
        return jsonify(errno=RET.PWDERR, errmsg="密码错误")

    # 4 设置新的密码
    user.password=news_password

    return jsonify(errno=RET.OK, errmsg="保存成功")




"""修改用户头像"""

@profile_blu.route("/pic_info",methods=["GET","POST"])
@user_login_data
def pic_info():
    user = g.user
    # 不同的请求方式实现不同的功能
    if request.method == "GET":
    # 查询到当前用户
        data = {
            "user": user.to_dict()
        }
        return render_template("news/user_pic_info.html", data=data)

    # 如果是POST的请求
    # 1  取到上传的图片
    try:
        avatar=request.files.get("avatar").read()
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")


    # 2 上传头像
    try:
        # 使用自己封装的storage方法去进行图片上传
        key=storage(avatar)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.THIRDERR, errmsg="上传图片失败")

    # 3 保存头像地址
    user.avatar_url=key
    return jsonify(errno=RET.OK, errmsg="OK",data={"avatar":constants.QINIU_DOMIN_PREFIX+key})




"""修改用户基本信息"""
@profile_blu.route("/base_info",methods=["GET","POST"])
@user_login_data
def base_info():

    #不同的请求方式实现不同的功能
    if request.method=="GET":
         #查询到当前用户
        user=g.user
        data={
            "user":user.to_dict()
        }
        return render_template("news/user_base_info.html",data=data)

    #代表用户修改数据
    # 1.  获取数据
    nick_name=request.json.get("nick_name")
    signature = request.json.get("signature")
    gender = request.json.get("gender")

    # 2. 校验参数
    if not all([nick_name,signature,gender]):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    #判断gender里面的数据
    if gender not in ("MAN","WOMEN"):
        return jsonify(errno=RET.PARAMERR, errmsg="参数错误")

    #修改用户多的基本信息
    user=g.user
    user.signature=signature
    user.nick_name=nick_name
    user.gender=gender

    return jsonify(errno=RET.OK, errmsg="退出成功")




"""基本页面的显示"""
@profile_blu.route("/info")
@user_login_data
def user_info():

    user=g.user
    # 判断用户是否登陆
    if not user:
        # 如果没有登陆重定向到首页
        return redirect("/")

    data={
    "user":user.to_dict()
    }
    return render_template("news/user.html",data=data)